/*
 * IMNetworkStorageP.nc -- network storage component
 *
 * Copyright (C) Andrey Vihrov <andrey.vihrov@gmail.com>, 2010
 * Copyright (C) Askar Salimbaev <ghostinshell@gmail.com>, 2010
 *
 * This file is part of Intermote.
 *
 * Intermote is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Intermote is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Intermote.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <Intermote.h>

configuration IMNetworkStorageP {

	provides {
		interface IMBlockStorage as BlockStorage;
		interface IMBlockProperty as BlockProperty[uint8_t];
	}

}
implementation {

	components IMNetworkStorageM, IMRoutingP, IMFloodingP, IMLibP;

	BlockStorage                       = IMNetworkStorageM;
	BlockProperty                      = IMNetworkStorageM;

	IMNetworkStorageM.BlockId         -> IMLibP;
	IMNetworkStorageM.RTPacket        -> IMRoutingP;
	IMNetworkStorageM.RTAMPacket      -> IMRoutingP;
	IMNetworkStorageM.FLPacket        -> IMFloodingP;

	components new IMTimeoutP() as AllocateTimeoutC;
	IMNetworkStorageM.AllocateSend    -> IMRoutingP.AMSend[RT_ALLOCATE];
	IMNetworkStorageM.AllocateReply   -> IMRoutingP.Receive[RT_ALLOCATE_REPLY];
	IMNetworkStorageM.AllocateTimeout -> AllocateTimeoutC;
	IMNetworkStorageM.AllocateFloodSend -> IMFloodingP.Send[FL_ALLOCATE];

	components new IMTimeoutP() as ReadTimeoutC;
	IMNetworkStorageM.ReadSend        -> IMRoutingP.AMSend[RT_READ];
	IMNetworkStorageM.ReadReply       -> IMRoutingP.Receive[RT_READ_REPLY];
	IMNetworkStorageM.ReadTimeout     -> ReadTimeoutC;

	components new IMTimeoutP() as WriteTimeoutC;
	IMNetworkStorageM.WriteSend        -> IMRoutingP.AMSend[RT_WRITE];
	IMNetworkStorageM.WriteReply       -> IMRoutingP.Receive[RT_WRITE_REPLY];
	IMNetworkStorageM.WriteTimeout     -> WriteTimeoutC;

	components new IMTimeoutP() as GetPropertyTimeoutC;
	IMNetworkStorageM.GetPropertySend  -> IMRoutingP.AMSend[RT_PROPERTY_GET];
	IMNetworkStorageM.GetPropertyReply -> IMRoutingP.Receive[RT_PROPERTY_GET_REPLY];
	IMNetworkStorageM.GetPropertyTimeout -> GetPropertyTimeoutC;

	components new IMTimeoutP() as SetPropertyTimeoutC;
	IMNetworkStorageM.SetPropertySend  -> IMRoutingP.AMSend[RT_PROPERTY_SET];
	IMNetworkStorageM.SetPropertyReply -> IMRoutingP.Receive[RT_PROPERTY_SET_REPLY];
	IMNetworkStorageM.SetPropertyTimeout -> SetPropertyTimeoutC;

	IMNetworkStorageM.EraseSend       -> IMRoutingP.AMSend[RT_ERASEBLOCK];

	IMNetworkStorageM.ReserveSend     -> IMFloodingP.Send[FL_RESERVE];

}
